home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / MPSRC045.LZH / P16_HIGH.HAS < prev    next >
Text File  |  1996-11-18  |  5KB  |  163 lines

  1. *=======================================================
  2. *
  3. *    16bitPCM 高音程変換
  4. *
  5. *=======================================================
  6.  
  7. PCM16_high:
  8.         move.w        CH_PITCH(a5),d1        * d1.w = ピッチ上位16bit
  9.         move.w        CH_PITCH+2(a5),d3    * d3.w = ピッチ下位16bit
  10.         moveq.l        #0,d2            * d2.w = ピッチカウンタ上位16bit
  11.         move.w        CH_VOL(a5),d5        * d5.w = PCM VOLUME
  12.  
  13.         tst.b        CH_KEY_STAT(a5)        * keyon=$01 keyoff=$80 non=$00
  14.         bmi        PCM16_high_keyoff
  15.         bne        PCM16_high_keyon
  16.  
  17. *        通常の処理
  18.         move.w        CH_PITCH_CTR(a5),d4    * d4.w = 音程カウンタ下位16bit
  19.         movea.l        CH_PCM_ADR(a5),a0    * a0.l = PCMアドレス
  20.         movea.l        CH_TRAP_ADR(a5),a3    * a3.l = トラップアドレス
  21.         movea.l        CH_TRAP_ROUTINE(a5),a4    * a4.l = トラップ時の処理ルーチン
  22.  
  23.         movea.l        CH_JMP_ADR2(a5),a6
  24.         jmp        (a6)
  25.  
  26. *        キーオンの処理
  27. PCM16_high_keyon:
  28.         clr.b        CH_KEY_STAT(a5)        * KEY 状態リセット
  29.  
  30.         moveq.l        #0,d4            * d4.l = 音程カウンタ
  31.         movea.l        CH_TOP_ADR(a5),a0    * a0.l = PCM先頭アドレス
  32.  
  33.         move.l        CH_LPTIME(a5),d7    * ループ処理があるか?
  34.         moveq.l        #1,d6
  35.         cmp.l        d6,d7            * cmpi.l より4clk 速い
  36.         beq        1f
  37.         move.l        d7,CH_LPTIME_CTR(a5)    * ループ回数カウンタ初期化
  38.         movea.l        CH_LPEND_ADR(a5),a3    * a3.l = ループ終了アドレス
  39.         lea.l        PCM16_LPEND,a4        * a4.l = ループ終了処理アドレス
  40.         move.l        a3,CH_TRAP_ADR(a5)
  41.         move.l        a4,CH_TRAP_ROUTINE(a5)    * トラップ情報ををワークに保存
  42.  
  43.         movea.l        CH_JMP_ADR2(a5),a6
  44.         jmp        (a6)
  45.  
  46. 1:        movea.l        CH_END_ADR(a5),a3    * a3.l = 16bit PCMデータ終了アドレス
  47.         lea.l        PCM16_END,a4        * a4.l = データ終了処理アドレス
  48.         move.l        a3,CH_TRAP_ADR(a5)
  49.         move.l        a4,CH_TRAP_ROUTINE(a5)    * トラップ情報ををワークに保存
  50.  
  51.         movea.l        CH_JMP_ADR2(a5),a6
  52.         jmp        (a6)
  53.  
  54. *        キーオフの処理
  55. PCM16_high_keyoff:
  56.         clr.b        CH_KEY_STAT(a5)        * KEY 状態リセット
  57.         clr.b        CH_PLAY_FLAG(a5)    * 演奏終了
  58.         jmp        make_keyoff_PCM        * 消音PCM展開
  59.  
  60. *=======================================================
  61.  
  62. PCM16_high_mac    macro        _vol
  63.  
  64.         move.l        CH_TPCNST(a5),d6
  65.         add.l        a0,d6
  66.         cmp.l        a3,d6
  67.         bcs        @f            * 今回はトラップしない
  68.  
  69. *        トラップ判定あり
  70.  
  71.         moveq.l        #MIX_SIZE*2-1-1,d6
  72.  
  73. 2:        add.w        d3,d4            * PITCH_CTR下位16bit += PITCH下位16bit
  74.         addx.w        d1,d2            * d2.w = d2.w + d1.w + CF
  75.         add.w        d2,d2
  76.         adda.w        d2,a0            * PCMアドレス更新
  77.         clr.w        d2            * PITCH_CTR上位16bitクリア
  78.  
  79.         cmpa.l        a3,a0            * トラップアドレス判定
  80.         bcs        1f
  81.         jsr        (a4)            * トラップ!
  82. 1:        move.w        (a0),d0            * PCMデータ取り込み
  83.         VOLUME        _vol,d0,d7
  84.         add.w        d0,(a1)+
  85.  
  86.         dbra        d6,2b
  87.  
  88. *        ラストの1回
  89.         add.w        d3,d4            * PITCH_CTR下位16bit += PITCH下位16bit
  90.         addx.w        d1,d2            * d2.w = d2.w + d1.w + CF
  91.         add.w        d2,d2
  92.         adda.w        d2,a0            * PCMアドレス更新
  93.  
  94.         cmpa.l        a3,a0
  95.         bcs        1f
  96.         jsr        (a4)            * トラップ!
  97. 1:        move.w        (a0),d0            * PCMデータ取り込み
  98.         move.w        d0,CH_LAST_PCM(a5)    * 前回変換終了時のPCM値 = d0.w
  99.         VOLUME        _vol,d0,d7
  100.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  101.         add.w        d0,(a1)+
  102.  
  103.         move.w        d4,CH_PITCH_CTR(a5)    * 音程カウンタ下位ワード = d4.w
  104.         move.l        a0,CH_PCM_ADR(a5)    * PCMアドレス = a0.l
  105.  
  106.         rts
  107.  
  108. *        トラップ判定無し
  109.  
  110. @@:        moveq.l        #MIX_SIZE*2-1-1,d6
  111.  
  112. 2:        add.w        d3,d4            * PITCH_CTR下位16bit += PITCH下位16bit
  113.         addx.w        d1,d2            * d2.w = d2.w + d1.w + CF
  114.         add.w        d2,d2
  115.         adda.w        d2,a0            * PCMアドレス更新
  116.         clr.w        d2            * PITCH_CTR上位16bitクリア
  117.  
  118.         move.w        (a0),d0            * PCMデータ取り込み
  119.         VOLUME        _vol,d0,d7
  120.         add.w        d0,(a1)+
  121.  
  122.         dbra        d6,2b
  123.  
  124. *        ラストの1回
  125.         add.w        d3,d4            * PITCH_CTR下位16bit += PITCH下位16bit
  126.         addx.w        d1,d2            * d2.w = d2.w + d1.w + CF
  127.         add.w        d2,d2
  128.         adda.w        d2,a0            * PCMアドレス更新
  129.  
  130.         move.w        (a0),d0            * PCMデータ取り込み
  131.         move.w        d0,CH_LAST_PCM(a5)    * 前回変換終了時のPCM値 = d0.w
  132.         VOLUME        _vol,d0,d7
  133.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  134.         add.w        d0,(a1)+
  135.  
  136.         move.w        d4,CH_PITCH_CTR(a5)    * 音程カウンタ下位ワード = d4.w
  137.         move.l        a0,CH_PCM_ADR(a5)    * PCMアドレス = a0.l
  138.  
  139.         rts
  140.  
  141.         endm
  142.  
  143. *=======================================================
  144.  
  145. PCM16_high_v00:    PCM16_high_mac    0
  146. PCM16_high_v01:    PCM16_high_mac    1
  147. PCM16_high_v02:    PCM16_high_mac    2
  148. PCM16_high_v03:    PCM16_high_mac    3
  149. PCM16_high_v04:    PCM16_high_mac    4
  150. PCM16_high_v05:    PCM16_high_mac    5
  151. PCM16_high_v06:    PCM16_high_mac    6
  152. PCM16_high_v07:    PCM16_high_mac    7
  153. PCM16_high_v08:    PCM16_high_mac    8
  154. PCM16_high_v09:    PCM16_high_mac    9
  155. PCM16_high_v10:    PCM16_high_mac    10
  156. PCM16_high_v11:    PCM16_high_mac    11
  157. PCM16_high_v12:    PCM16_high_mac    12
  158. PCM16_high_v13:    PCM16_high_mac    13
  159. PCM16_high_v14:    PCM16_high_mac    14
  160. PCM16_high_v15:    PCM16_high_mac    15
  161. PCM16_high_vnn:    PCM16_high_mac    'n'
  162. PCM16_high_non:    PCM16_high_mac    'x'
  163.